package exia.java.core.services;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

import net.sf.hibernate.HibernateException;
import net.sf.hibernate.Query;
import net.sf.hibernate.Session;
import net.sf.hibernate.Transaction;

import exia.java.core.entities.Utilisateur;

/**
 * 
 * @author Jeannette Sebastien
 *
 */
class HibernateServiceUtilisateurImpl implements IServiceUtilisateur {

	private static final String REMOTE_SERVICE_NAME = "Hibernate Remote Utilisateur Service";
	private static final double REMOTE_SERVICE_VERSION = 0.1;
	private Session WORKING_SESSION;
	/**
	 * 
	 * @param workingSession
	 */
	public HibernateServiceUtilisateurImpl(final Session workingSession){
		super();
		WORKING_SESSION = workingSession;
	}
	
	public HibernateServiceUtilisateurImpl(){
		super();
	}
	
	/**
	 * 
	 * @param workingSession
	 */
	public void changeWorkingSession(final Session workingSession){
		if(workingSession != null){
			this.WORKING_SESSION = workingSession;
		}
	}
	
	/**
	 * 
	 * @return
	 */
	public Session getWorkingSession(){
		return this.WORKING_SESSION;
	}
	
	public boolean addUtilisateur(final Utilisateur utilisateur)throws ServiceUtilisateurException {
		boolean isAdded = false;
		Transaction tx = null;
		if((WORKING_SESSION != null)&&(utilisateur != null)){
			try {
				tx = WORKING_SESSION.beginTransaction();
				WORKING_SESSION.save(utilisateur);
				tx.commit();
				if(tx.wasCommitted()){
					isAdded = true;
				}
			} catch (HibernateException ex) {
				ex.printStackTrace();
				throw new ServiceUtilisateurException(ex);
			}
		}
		return isAdded;
	}

	public int countUtilisateurs() throws ServiceUtilisateurException {
		return this.getUtilisateurs().size();
	}

	public Utilisateur getUtilisateurById(final int id)throws ServiceUtilisateurException {
		Utilisateur utilisateur = null;
		List<Utilisateur> tmp = null;
		if(this.WORKING_SESSION != null){
			if(id > 0){
				tmp = this.getUtilisateurs();
				if((tmp != null)&&(tmp.size() > 0)){
					for(Utilisateur u : tmp){
						if(u.getId() == id){
							utilisateur = u;
							break;
						}
					}
				}
			}else{
				throw new ServiceUtilisateurException("\nINCORRECT ID VALUE ERROR: The id parameter of the getUtilisateurById methode must be greater than 0.\n");
			}
		}else{
			throw new ServiceUtilisateurException("\nNULL SESSION ERROR: Unable to get the desired Utilisateur.\n\tcause: the current WORKING_SESSION field of the "+REMOTE_SERVICE_NAME+" (version "+REMOTE_SERVICE_VERSION+") is null.\n");
		}
		return utilisateur;
	}

	public List<Utilisateur> getUtilisateurs()throws ServiceUtilisateurException {
		List<Utilisateur> utilisateurs = null;
		Iterator it = null;
		Utilisateur u = null;
		Query query = null;
		if(this.WORKING_SESSION != null){
			try {
				utilisateurs = new ArrayList<Utilisateur>();
				String SQL_QUERY ="from Utilisateur utilisateur";
					 query = this.WORKING_SESSION.createQuery(SQL_QUERY);
					 if(query != null){
						 for(it=query.iterate();it.hasNext();){
					     	u = (Utilisateur) it.next();
					     	utilisateurs.add(u);
					     }
					 }
			} catch (HibernateException ex) {
				ex.printStackTrace();
				utilisateurs = null;
				throw new ServiceUtilisateurException(ex);
			}
		}else{
			throw new ServiceUtilisateurException("\nNULL SESSION ERROR: Unable to get the Utilisateurs.\n\tcause: the current WORKING_SESSION field of the "+REMOTE_SERVICE_NAME+" (version "+REMOTE_SERVICE_VERSION+") is null.\n");
		}
		return utilisateurs;
	}

	public List<Utilisateur> getUtilisateursByType(final String type)throws ServiceUtilisateurException {
		List<Utilisateur> utilisateurs = null;
		List<Utilisateur> tmp = null;
		if(this.WORKING_SESSION != null){
			if((type.length() > 0)){
				tmp = this.getUtilisateurs();
				if((tmp != null)&&(tmp.size() > 0)){
					utilisateurs = new ArrayList<Utilisateur>();
					for(Utilisateur u : tmp){
						if(u.getType().equals(type.toLowerCase())){
							utilisateurs.add(u);
						}
					}
				}
			}else{
				throw new ServiceUtilisateurException("\nINCORRECT ID VALUE ERROR: The id parameter of the getUtilisateurById methode must be greater than 0.\n");
			}
		}else{
			throw new ServiceUtilisateurException("\nNULL SESSION ERROR: Unable to get the desired Utilisateur.\n\tcause: the current WORKING_SESSION field of the "+REMOTE_SERVICE_NAME+" (version "+REMOTE_SERVICE_VERSION+") is null.\n");
		}
		return utilisateurs;
	}

	public boolean hasUtilisateur(final Utilisateur utilisateur)throws ServiceUtilisateurException {
		boolean has = false;
		List<Utilisateur> tmp = null;
		if(this.WORKING_SESSION != null){
			if(utilisateur != null){
				tmp = this.getUtilisateurs();
				if((tmp != null)&&(tmp.size() > 0)){
					for(Utilisateur u : tmp){
						if(u.equals(utilisateur)){
							has = true;
							break;
						}
					}
				}
			}else{
				throw new ServiceUtilisateurException("\nNULL POINTER ERROR: the Utilisateur parameter of the hasUtilisateur method is null.\n");
			}
		}else{
			throw new ServiceUtilisateurException("\nNULL SESSION ERROR: Unable to tell if Utilisateurs are Registered.\n\tcause: the current WORKING_SESSION field of the "+REMOTE_SERVICE_NAME+" (version "+REMOTE_SERVICE_VERSION+") is null.\n");
		}
		return has;
	}

	public boolean hasUtilisateurs() throws ServiceUtilisateurException {
		boolean has = false;
		if(this.WORKING_SESSION != null){
			if(this.countUtilisateurs() > 0){
				has = true;
			}
		}else{
			throw new ServiceUtilisateurException("\nNULL SESSION ERROR: Unable to tell if Utilisateurs are Registered.\n\tcause: the current WORKING_SESSION field of the "+REMOTE_SERVICE_NAME+" (version "+REMOTE_SERVICE_VERSION+") is null.\n");
		}
		return has;
	}

	public boolean removeUtilisateur(final Utilisateur utilisateur)throws ServiceUtilisateurException {
		boolean isRemoved = false;
		Transaction tx = null;
		if((this.WORKING_SESSION != null)){
			if((utilisateur != null)){
				try {
					tx = this.WORKING_SESSION.beginTransaction();
					this.WORKING_SESSION.delete(utilisateur);
					tx.commit();
					if(tx.wasCommitted()){
						isRemoved = true;
					}
				} catch (HibernateException ex) {
					ex.printStackTrace();
					throw new ServiceUtilisateurException(ex);
				}
			}else{
				throw new ServiceUtilisateurException("\nNULL POINTER ERROR: Utilisateur parameter of the updateUtilisateur method is null.\n");
			}
		}else{
			throw new ServiceUtilisateurException("\nNULL SESSION ERROR: Unable to remove the Utilisateur.\n\tcause: the current WORKING_SESSION field of the "+REMOTE_SERVICE_NAME+" (version "+REMOTE_SERVICE_VERSION+") is null.\n");
		}
		return isRemoved;
	}

	public boolean updateUtilisateur(final Utilisateur utilisateur)throws ServiceUtilisateurException {
		boolean isUpdated = false;
		Transaction tx = null;
		if((this.WORKING_SESSION != null)){
			if((utilisateur != null)){
				try {
					tx = this.WORKING_SESSION.beginTransaction();
					this.WORKING_SESSION.update(utilisateur);
					tx.commit();
					if(tx.wasCommitted()){
						isUpdated = true;
					}
				} catch (HibernateException ex) {
					ex.printStackTrace();
					throw new ServiceUtilisateurException(ex);
				}
			}else{
				throw new ServiceUtilisateurException("\nNULL POINTER ERROR: Utilisateur parameter of the updateUtilisateur method is null.\n");
			}
		}else{
			throw new ServiceUtilisateurException("\nNULL SESSION ERROR: Unable to update the Utilisateur.\n\tcause: the current WORKING_SESSION field of the "+REMOTE_SERVICE_NAME+" (version "+REMOTE_SERVICE_VERSION+") is null.\n");
		}
		return isUpdated;
	}

	public String getRemoteServiceName(){
		return REMOTE_SERVICE_NAME;
	}

	public Object performRemoteServiceFunction(final String functionName, final Object[] params)throws RemoteServiceException {
		Object obj = null;
		return obj;
	}

	public double getRemoveServiceVersion() {
		return REMOTE_SERVICE_VERSION;
	}

}
